package main

import (
	"encoding/json"
	"fmt"
)

/* [序] 结构体字段可见性和JSON
- 字段首字母小写，则无法进行 json 序列化与反序列化
- 若想自定义序列化后的字段，则需用使用tag，在字段名称后声明，底层通过反射进行序列化

*/
func main() {
	class1 := class{
		Title:    "疯狂1班",
		Students: make([]student, 0, 20), //声明切片len=0,cap=20
	}
	//往班级中添加学生
	for i := 0; i < 10; i++ {
		//造十个学生
		tmpStu := newStudent(i, fmt.Sprintf("stu%02d", i))
		class1.Students = append(class1.Students, tmpStu)

	}
	fmt.Printf("%#v\n", class1)

	/* [01] 将数据 格式化为JSON字符串 */
	data, err := json.Marshal(class1)
	if err != nil {
		fmt.Println("json marshal failed!")
		return
	}
	fmt.Printf("type %T\n", data)
	fmt.Printf("json str:%s\n", data)
	//json转换为数据
	jsonStr := "{\"Title\":\"疯狂1班\",\"Students\":[{\"ID\":0,\"Name\":\"stu00\"},{\"ID\":1,\"Name\":\"stu01\"}]}"
	var class2 class
	err2 := json.Unmarshal([]byte(jsonStr), &class2)
	if err2 != nil {
		fmt.Println("json unmarshal fail,err: ", err2)
	}
	fmt.Printf("%#v\n", class2)

}
func newStudent(id int, name string) student {
	return student{
		ID:   id,
		Name: name,
	}
}

type student struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
}
type class struct {
	Title    string
	Students []student `json:"student_list"` //声明切片
}
